home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programmer's Power Pack / Delphi Volume 1.iso / s_to_z / spidr100 / setup.arv / ARRTEST.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-09-15  |  9.1 KB  |  364 lines

  1. {----------------------------------------------------------------------------
  2. |
  3. | Library: Spider Containers for Object Pascal
  4. |
  5. | Module: ArrTest.Pas
  6. |
  7. | Description: Form for TArray test.
  8. |
  9. | History: Version 1.0  March 1996. Copyright (c) 1996 Michel Brazeau
  10. |                                   Interval Software
  11. |
  12. |---------------------------------------------------------------------------}
  13. unit ArrTest;
  14.  
  15. interface
  16.  
  17. uses
  18.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  19.   Forms, Dialogs, StdCtrls, ExtCtrls,
  20.  
  21.   ObjArray;  { TArray }
  22.  
  23. type
  24.   TArrayForm = class(TForm)
  25.     AddRandomButton: TButton;
  26.     RemoveButton: TButton;
  27.     ClearButton: TButton;
  28.     ShellSort: TButton;
  29.     QuickSort: TButton;
  30.     Load: TButton;
  31.     BinarySearch: TButton;
  32.     LinearSearch: TButton;
  33.     ListBox: TListBox;
  34.     AddButton: TButton;
  35.     ItemCount: TLabel;
  36.     ResizeButton: TButton;
  37.     procedure FormCreate(Sender: TObject);
  38.     procedure FormDestroy(Sender: TObject);
  39.     procedure RemoveButtonClick(Sender: TObject);
  40.     procedure AddRandomButtonClick(Sender: TObject);
  41.     procedure ClearButtonClick(Sender: TObject);
  42.     procedure ShellSortClick(Sender: TObject);
  43.     procedure QuickSortClick(Sender: TObject);
  44.     procedure LoadClick(Sender: TObject);
  45.     procedure BinarySearchClick(Sender: TObject);
  46.     procedure LinearSearchClick(Sender: TObject);
  47.     procedure ListBoxDrawItem(Control: TWinControl; Index: Integer;
  48.       Rect: TRect; State: TOwnerDrawState);
  49.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  50.     procedure AddButtonClick(Sender: TObject);
  51.     procedure ResizeButtonClick(Sender: TObject);
  52.  
  53.   private
  54.      ObjArray : TArray;
  55.  
  56.      { updates the ItemCount lable from the List.Size }
  57.      procedure UpdateItemCount;
  58.  
  59.      { add a value to the array }
  60.      procedure AddValue(Value : Word);
  61.  
  62.   end;
  63.  
  64. {--------------------------------------------------------------------------}
  65.  
  66. implementation
  67.  
  68. {$R *.DFM}
  69.  
  70. uses
  71.       ObjTest,   { GetRandomNumber }
  72.       ObjList,   { TUnorderedList }
  73.       ObjBuckt;  { TBucket }
  74.  
  75. {--------------------------------------------------------------------------}
  76.  
  77. procedure TArrayForm.FormCreate(Sender: TObject);
  78. begin
  79.     ObjArray := TArray.Create(TWordBucket, CompareWordBucket, 3000, 1000);
  80. end;
  81.  
  82. {--------------------------------------------------------------------------}
  83.  
  84. procedure TArrayForm.FormDestroy(Sender: TObject);
  85. begin
  86.     ObjArray.Free;
  87. end;
  88.  
  89. {--------------------------------------------------------------------------}
  90.  
  91. procedure TArrayForm.AddValue(Value : Word);
  92. var
  93.     Bucket : TWordBucket;
  94. begin
  95.     Bucket := TWordBucket.Create(Value);
  96.     try
  97.         ListBox.Items.AddObject('', nil);
  98.         try
  99.             ObjArray.Insert(Bucket);
  100.         except
  101.             ListBox.Items.Delete(ListBox.Items.Count-1);
  102.             raise;
  103.         end;
  104.     except
  105.         Bucket.Free;
  106.         raise;
  107.     end;
  108. end;
  109.  
  110. {--------------------------------------------------------------------------}
  111.  
  112. procedure TArrayForm.UpdateItemCount;
  113. begin
  114.     ItemCount.Caption := IntToStr(ObjArray.Size);
  115. end;
  116.  
  117. {--------------------------------------------------------------------------}
  118.  
  119. procedure TArrayForm.AddRandomButtonClick(Sender: TObject);
  120. var
  121.     Bucket : TWordBucket;
  122. begin
  123.     AddValue(GetRandomNumber);
  124.  
  125.     ListBox.ItemIndex := ListBox.Items.Count - 1;
  126.  
  127.     UpdateItemCount;
  128. end;
  129.  
  130. {--------------------------------------------------------------------------}
  131.  
  132. procedure TArrayForm.RemoveButtonClick(Sender: TObject);
  133. var
  134.     Item : LongInt;  { 0 based item index }
  135.  
  136. begin
  137.     Item := ListBox.ItemIndex;
  138.  
  139.     if Item <= -1 then
  140.         Exit;  { no item is selected, since ItemIndex = -1 when no item is
  141.                  selected }
  142.  
  143.     ObjArray.Delete(Item+1);
  144.  
  145.     ListBox.Items.Delete(Item);
  146.  
  147.     { keep an item selected, convert from 1 based to 0 based }
  148.     if ListBox.Items.Count <= Item then
  149.         ListBox.ItemIndex := Item - 1
  150.     else
  151.         ListBox.ItemIndex := Item;
  152.  
  153.     UpdateItemCount;
  154. end;
  155.  
  156. {--------------------------------------------------------------------------}
  157.  
  158. procedure TArrayForm.ClearButtonClick(Sender: TObject);
  159. begin
  160.     { clear the list box }
  161.     ListBox.Clear;
  162.  
  163.     { clear the array }
  164.     ObjArray.Clear;
  165.  
  166.     UpdateItemCount;
  167. end;
  168.  
  169. {--------------------------------------------------------------------------}
  170.  
  171. procedure TArrayForm.ShellSortClick(Sender: TObject);
  172. begin
  173.     Screen.Cursor := crHourGlass;
  174.     try
  175.         ObjArray.ShellSort;
  176.  
  177.         ListBox.Refresh;
  178.     finally
  179.         Screen.Cursor := crDefault;
  180.     end;
  181. end;
  182.  
  183. {--------------------------------------------------------------------------}
  184.  
  185. procedure TArrayForm.QuickSortClick(Sender: TObject);
  186. begin
  187.     Screen.Cursor := crHourGlass;
  188.     try
  189.         ObjArray.QuickSort;
  190.  
  191.         ListBox.Refresh;
  192.     finally
  193.         Screen.Cursor := crDefault;
  194.     end;
  195. end;
  196.  
  197. {--------------------------------------------------------------------------}
  198.  
  199. procedure TArrayForm.LoadClick(Sender: TObject);
  200. var
  201.     NumberList  : TUnorderedList;
  202.  
  203.     WordBucket : TWordBucket;
  204.  
  205.     Value      : Word;
  206.  
  207.     I          : LongInt;
  208. begin
  209.     NumberList := TUnOrderedList.Create(TWordBucket, CompareWordBucket);
  210.     try
  211.         TestForm.LoadNumbersFromFile(NumberList);
  212.  
  213.         Screen.Cursor := crHourGlass;
  214.         try
  215.             I := 1;
  216.  
  217.             { insert all the values in NumberList }
  218.             if NumberList.GotoFirst then
  219.             repeat
  220.  
  221.                 { give other applications processing time }
  222.                 if (I mod 500) = 0 then
  223.                     Application.ProcessMessages;
  224.                 Inc(I);
  225.  
  226.  
  227.                 Value := (NumberList.CurrentObj as TWordBucket).Value;
  228.  
  229.                 WordBucket := TWordBucket.Create(Value);
  230.  
  231.                 AddValue(Value);
  232.  
  233.             until not NumberList.GotoNext;
  234.         finally
  235.             Screen.Cursor := crDefault;
  236.         end;
  237.  
  238.     finally
  239.         NumberList.Free;
  240.  
  241.         ListBox.ItemIndex := ListBox.Items.Count - 1;
  242.  
  243.         UpdateItemCount;
  244.     end;
  245.  
  246. end;
  247.  
  248. {--------------------------------------------------------------------------}
  249.  
  250. procedure TArrayForm.BinarySearchClick(Sender: TObject);
  251. const
  252.     NumberStr : String = '0';
  253.  
  254. var
  255.     Bucket    : TWordBucket;
  256.  
  257.     Index     : TArrayIndex;
  258.  
  259. begin
  260.     if not InputQuery('', 'Search for: ', NumberStr) then
  261.         Exit;
  262.  
  263.     Bucket := TWordBucket.Create(StrToInt(NumberStr));
  264.     try
  265.         Index := ObjArray.BinarySearch(Bucket);
  266.         if Index <> CInvalidArrayIndex then
  267.             MessageDlg('Value found at index ' + IntToStr(Index), mtInformation,[mbOk], 0)
  268.         else
  269.             MessageDlg('Value NOT found!', mtInformation,[mbOk], 0);
  270.  
  271.     finally
  272.         Bucket.Free;
  273.     end;
  274. end;
  275.  
  276. {--------------------------------------------------------------------------}
  277.  
  278. procedure TArrayForm.LinearSearchClick(Sender: TObject);
  279. const
  280.     NumberStr : String = '0';
  281. var
  282.     Bucket    : TWordBucket;
  283.  
  284.     Index     : TArrayIndex;
  285.  
  286. begin
  287.     if not InputQuery('', 'Search for: ', NumberStr) then
  288.         Exit;
  289.  
  290.     Bucket := TWordBucket.Create(StrToInt(NumberStr));
  291.     try
  292.         Index := ObjArray.LinearSearch(Bucket);
  293.         if Index <> CInvalidArrayIndex then
  294.             MessageDlg('Value found at index ' + IntToStr(Index), mtInformation,[mbOk], 0)
  295.         else
  296.             MessageDlg('Value NOT found!', mtInformation,[mbOk], 0);
  297.  
  298.     finally
  299.         Bucket.Free;
  300.     end;
  301. end;
  302.  
  303. {--------------------------------------------------------------------------}
  304.  
  305. procedure TArrayForm.ListBoxDrawItem(Control: TWinControl; Index: Integer;
  306.   Rect: TRect; State: TOwnerDrawState);
  307. begin
  308.     with (Control as TListBox).Canvas do
  309.     begin
  310.         FillRect(Rect);    { clear the rectangle }
  311.  
  312.         TextOut( Rect.Left + 2, Rect.Top,
  313.                  IntToStr((ObjArray[Index+1] as TWordBucket).Value))
  314.     end; { with }
  315. end;
  316.  
  317. {--------------------------------------------------------------------------}
  318.  
  319. procedure TArrayForm.FormClose( Sender: TObject;
  320.                                 var Action: TCloseAction);
  321. begin
  322.     Action := caFree;
  323. end;
  324.  
  325. {--------------------------------------------------------------------------}
  326.  
  327. procedure TArrayForm.AddButtonClick(Sender: TObject);
  328. const
  329.     NumStr : String = '0';
  330. begin
  331.  
  332.     if not InputQuery('', 'Value to add: ', NumStr) then
  333.         Exit;
  334.  
  335.     AddValue(StrToInt(NumStr));
  336.  
  337.     ListBox.ItemIndex := ListBox.Items.Count - 1;
  338.  
  339.     UpdateItemCount;
  340. end;
  341.  
  342. {--------------------------------------------------------------------------}
  343.  
  344. procedure TArrayForm.ResizeButtonClick(Sender: TObject);
  345. const
  346.     CapacityStr : String = '1000';
  347.     DeltaStr    : String = '500';
  348.  
  349. begin
  350.     if not InputQuery('', 'New Capacity: ', CapacityStr) then
  351.         Exit;
  352.  
  353.     if not InputQuery('', 'New Delta: ', DeltaStr) then
  354.         Exit;
  355.  
  356.     ObjArray.Capacity := StrToInt(CapacityStr);
  357.  
  358.     ObjArray.Delta    := StrToInt(DeltaStr);
  359. end;
  360.  
  361. {--------------------------------------------------------------------------}
  362.  
  363. end.
  364.